home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / misc / amag / sh9301c.lha / Komprimieren(S.89) / Huffman-Codes.asm next >
Assembly Source File  |  1993-01-12  |  3KB  |  215 lines

  1.  
  2.     lea    a,a1        ; Anfangsadresse der Quelldatei
  3.     lea    ziel,a2        ; Anfangsadresse der Zieldatei
  4.     move.l    #aend-a,d7    ; Quelldateilänge
  5.     jsr    Pack
  6.  
  7.  
  8.     lea    ziel,a0        ; Anfangsadresse der komprimierten Datei
  9.     lea    a,a5        ; Anfangsadresse der Zieldatei
  10.     jsr    Unpack
  11.     rts
  12.  
  13. a:    incbin    "Programmname"    ; zu komprimierendes Programm
  14. aend:
  15.  
  16.  
  17. Pack:
  18.     move.l    d7,-(sp)
  19.     move.l    a1,-(sp)
  20.     move.l    a2,-(sp)
  21.  
  22.     lea    count(pc),a0
  23.     subq.l    #1,d7
  24. Anzahl:    moveq    #0,d0
  25.     move.b    (a1,d7.l),d0
  26.     add.w    d0,d0
  27.     add.w    d0,d0
  28.     addq.l    #1,(a0,d0.w)
  29.     dbra    d7,Anzahl
  30.  
  31.     moveq    #0,d0
  32.     move.l    d0,d7
  33.     move.l    a0,a2
  34.     lea    heap(pc),a3
  35. Loop2:    tst.l    (a2)+
  36.     beq.s    Loop
  37.     addq.w    #2,d0
  38.     move.w    d7,(a3)+
  39. Loop:    addq.w    #4,d7
  40.     cmp.w    #$400,d7
  41.     bne.s    Loop2
  42.  
  43.     lea    heap(pc),a3
  44.     move.l    d0,d6
  45.     move.l    d0,d1
  46.     lsr.w    #1,d1
  47. down:    move.w    d6,d7
  48.     move.w    -2(a3,d7.w),d2
  49.     bsr    downheap
  50.     subq.w    #2,d6
  51.     bne.s    down
  52.  
  53.     lea    dad(pc),a4
  54. repeat:    move.w    (a3),d6
  55.     move.w    -2(a3,d0.w),(a3)
  56.     subq.w    #2,d0
  57.     moveq    #2,d7
  58.     move.l    d0,d1
  59.     lsr.w    #1,d1
  60.  
  61.     move.w    (a3),d2
  62.     bsr    downheap
  63.  
  64.     move.w    (a3),d2
  65.     move.l    (a0,d2.w),d3
  66.     add.l    (a0,d6.w),d3
  67.     move.l    d0,d7
  68.     add.l    d7,d7
  69.     move.l    d3,-4(a2,d7.w)
  70.     add.l    #$3fc,d7
  71.     move.l    d7,(a4,d6.w)
  72.     move.w    d7,(a3)
  73.     neg.l    d7
  74.     move.l    d7,(a4,d2.w)
  75.  
  76.     moveq    #2,d7
  77.     move.w    (a3),d2
  78.     bsr    downheap
  79.  
  80.     cmp.w    #2,d0
  81.     bne.s    repeat
  82.     clr.l    $400(a4)
  83.  
  84.     lea    code(pc),a2
  85.     lea    len(pc),a3
  86.     moveq    #0,d7
  87. for:    moveq    #-1,d0
  88.     tst.l    (a0)+
  89.     bne.s    Weiter2
  90.     clr.w    (a2)+
  91.     move.b    d0,(a3)+
  92.     bra.s    next
  93. Weiter2:moveq    #1,d1
  94.     moveq    #0,d3
  95.     move.l    (a4,d7.w),d2
  96. repeat2:bge.s    ben
  97.     add.l    d1,d3
  98.     neg.l    d2
  99. ben:    add.l    d1,d1
  100.     addq.l    #1,d0
  101.     move.l    (a4,d2.w),d2
  102.     bne.s    repeat2
  103.     move.w    d3,(a2)+
  104.     move.b    d0,(a3)+
  105. next:    addq.w    #4,d7
  106.     cmp.w    #$400,d7
  107.     bne.s    for
  108.  
  109.     move.l    (sp)+,a0
  110.     move.l    (sp)+,a2
  111.     add.l    (sp)+,a2
  112.  
  113.     lea    len(pc),a3
  114.     lea    code(pc),a4
  115.     moveq    #0,d7
  116.     move.l    d7,d0
  117.     move.l    d7,d6
  118.     move.l    d7,d2
  119. for2:    moveq    #0,d0
  120.     move.b    (a1)+,d0
  121.     moveq    #0,d1
  122.     move.b    (a3,d0.w),d1
  123.     add.w    d0,d0
  124.     lea    1(a4,d0.w),a5
  125. rueck:    cmp.b    #8,d1
  126.     blt.s    rueck2
  127.     move.b    d1,d2
  128.     subq.b    #8,d2
  129.     btst    d2,-1(a5)
  130.     bra.s    wtw
  131. rueck2:    btst    d1,(a5)
  132. wtw:    beq.s    wt
  133.     bset    d7,(a0)
  134. wt:    addq.l    #1,d6
  135.     addq.b    #1,d7
  136.     and.b    #7,d7
  137.     bne.s    wet
  138.     addq.l    #1,a0
  139. wet:    dbf    d1,rueck
  140.     cmp.l    a1,a2
  141.     bne.s    for2
  142.     subq.l    #1,d6
  143.     lea    length(pc),a0
  144.     move.l    d6,(a0)
  145.     rts
  146.  
  147. downheap:
  148.     cmp.w    d1,d7
  149.     bgt.s    Weiter
  150.     move.l    d7,d3
  151.     add.w    d3,d3
  152.     cmp.w    d0,d3
  153.     bge.s    Sprung
  154.     lea    -2(a3,d3.w),a5
  155.     move.w    (a5)+,d4
  156.     move.w    (a5),d5
  157.     move.l    (a0,d5.w),d5
  158.     cmp.l    (a0,d4.w),d5
  159.     bge.s    Sprung
  160.     addq.w    #2,d3
  161. Sprung:    move.w    -2(a3,d3.w),d4
  162.     move.l    (a0,d4.w),d5
  163.     cmp.l    (a0,d2.w),d5
  164.     bgt.s    Weiter
  165.     move.w    d4,-2(a3,d7.w)
  166.     move.w    d3,d7
  167.     bra.s    downheap
  168. Weiter:    move.w    d2,-2(a3,d7.w)
  169.     rts
  170.  
  171. heap:    dcb.w    256,0
  172. count:    dcb.l    2*256,0
  173. dad:    dcb.l    2*256,0
  174.  
  175.  
  176.  
  177. Unpack:
  178.     move.l    length(pc),d4    ; komprimierte Dateilänge in Bits
  179.     lea    code(pc),a3
  180.     moveq    #0,d0
  181.     move.l    d0,d6
  182.     move.l    d0,d5
  183. re:    btst    d6,(a0)
  184.     beq.s    nicht
  185.     addq.b    #1,d0
  186. nicht:    addq.b    #1,d6
  187.     and.b    #7,d6
  188.     bne.s    nicht2
  189.     addq.l    #1,a0
  190. nicht2:    moveq    #0,d7
  191.     lea    len(pc),a2
  192. ll:    cmp.b    (a2)+,d5
  193.     bne.s    l2
  194.     move.w    d7,d1
  195.     add.w    d1,d1
  196.     cmp.w    (a3,d1.w),d0
  197.     bne.s    l2
  198.     moveq    #0,d0
  199.     move.b    #-1,d5
  200.     move.b    d7,(a5)+
  201.     move.b    d5,d7
  202. l2:    addq.b    #1,d7
  203.     bne.s    ll
  204.     add.w    d0,d0
  205.     addq.b    #1,d5
  206.     dbf    d4,re
  207.     rts
  208.  
  209.  
  210. length:    dc.l    0        ; komprimiertes Programm
  211. code:    dcb.w    256,0
  212. len:    dcb.b    256,0
  213.  
  214. ziel:    dcb.b    aend-a,0
  215.